#ifndef SQL_HANDLER_H
#define SQL_HANDLER_H

#include <string>
#include <functional>
#include <vector>
#include <memory>
#include <map>
#include <any>
#include <typeinfo>
#include <stdexcept>
#include "connect_assist.h" // 包含MYSQLScopedConnection

// 数据库参数类型枚举
enum class ParamType {
    INT,
    BIGINT,
    STRING,
    DOUBLE,
    BOOL,
    NULL_VALUE
};

// 函数参数元信息
struct FunctionParamsInfo {
    std::string sqlTemplate;        // SQL模板
    std::vector<ParamType> paramTypes; // 参数类型列表
    bool isQuery;                   // 是否为查询操作
};

// 修改返回类型为自定义结构
struct QueryResult {
    std::vector<std::vector<std::string>> rows;
    bool success = false;
    std::string error;
    long long affected_rows = 0;  // 添加影响行数成员
    // 默认构造函数
    QueryResult() = default;
    
    // 带参数的构造函数
    QueryResult(bool s, const std::string& e, const std::vector<std::vector<std::string>>& r, long long ar)
        : success(s), error(e), rows(r), affected_rows(ar) {}
};

class SQLHandler {
private:
    MySQLConnectionPool& m_pool;
    std::map<std::string, FunctionParamsInfo> m_functionMap; // 函数注册表

    // 类型转换辅助函数
    template<typename T> T convertParam(const std::string& value);
    
    // 执行带参数的查询（返回结果集）
    QueryResult executePreparedQuery(const std::string& sql, const std::vector<std::any>& params);
    
    // 执行带参数的更新（INSERT/UPDATE/DELETE）
    bool executePreparedUpdate(const std::string& sql, const std::vector<std::any>& params);

public:
    explicit SQLHandler(MySQLConnectionPool& pool);
    ~SQLHandler();
    
    // 注册SQL操作函数
    void registerFunction(const std::string& funcName, const FunctionParamsInfo& info);
    
    // 动态执行SQL操作
    bool execute(const std::string& funcName, const std::vector<std::string>& strParams, std::string& result);
    
    // 用户相关操作
    bool insertUser(const std::string& username, const std::string& password);
    bool checkUserExists(const std::string& username);
    
    // 消息相关操作
    bool insertMessage(const std::string& sender, const std::string& content);
    bool getMessages(const std::string& recipient, int limit, std::string& outMessages);
    
    // 通用查询方法（支持自定义结果处理）
    template <typename T>
    bool queryWithCallback(const std::string& sql, std::function<T(MYSQL_ROW)> callback, T& result);
};

#endif // SQL_HANDLER_H